// operator()重载
#include <iostream>

using namespace std;

// 如果针对某个class进行operator()重载，它就成为一个仿函数
template <class T>
struct add
{
    T operator() (const T& x, const T& y) const
    {
        return x + y;
    }
};

template <class T>
struct sub
{
    T operator() (const T& x, const T& y) const
    {
        return x - y;
    }
};

int main()
{
    // 产生仿函数对象
    add<int> plusobj;
    sub<int> minusobj;

    // 以下使用仿函数，就像使用一般函数一样
    cout << plusobj(6, 3) << endl;
    cout << minusobj(6, 3) << endl;

    // 以下直接产生仿函数的临时对象（第一对小括号），并调用它（第二对小括号）
    cout << add<int>() (33, 22) << endl;
    cout << sub<int>() (33, 22) << endl;

    return 0;
}
